package com.bwie.cart.service.impl;

import com.bwie.cart.constants.CartConstants;
import com.bwie.cart.domain.dto.CartAddDTO;
import com.bwie.cart.domain.po.CartDetailPo;
import com.bwie.cart.domain.po.CartPo;
import com.bwie.cart.domain.vo.Cart;
import com.bwie.cart.domain.vo.CartItem;
import com.bwie.cart.mapper.CartMapper;
import com.bwie.cart.service.CartService;
import com.bwie.common.core.exception.ServiceException;
import com.bwie.common.core.utils.bean.BeanUtils;
import com.bwie.common.redis.service.RedisService;
import com.bwie.common.security.utils.SecurityUtils;
import com.bwie.system.api.model.LoginUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.swing.text.Caret;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;


@Service
public class CartServiceImpl implements CartService {

    /**
     * 注入
     */
    @Autowired
    private CartMapper mapper;
    @Autowired
    private RedisService redisService;
    /**
     * 添加购物车
     * @param addCart
     */
    @Transactional
    @Override
    public void addCart(CartAddDTO addCart) {
        //获取登录用户
        LoginUser loginUser = SecurityUtils.getLoginUser();
        //获取key
        String CartKey = CartConstants.USER_CART+String.valueOf(loginUser.getUserid());
        //获取cartItem
        CartItem cartItem = getCartItem(addCart);
        //redis判断是否存在购物车
        if (!redisService.hasKey(CartKey)){
            //创建cartPo对象
            CartPo cartPo = new CartPo();
            //赋值
            cartPo.setUserId(loginUser.getUserid());
            //添加购物车并返回id
            mapper.addCart(cartPo);
            //赋值
            cartItem.setCartId(cartPo.getId());
            //购物车不存在,添加购物车
            redisService.setCacheMapValue(CartKey,String.valueOf(addCart.getSkuId()),cartItem);
        }else{
            //购物车存在
            CartItem cartItemMapValue = redisService.getCacheMapValue(CartKey, String.valueOf(addCart.getSkuId()));
            //获取购物车id
            CartPo cartPoByUserId = mapper.getCartPoByUserId(loginUser.getUserid());
            //赋值
            cartItem.setCartId(cartPoByUserId.getId());
            //非空判断
            if (cartItemMapValue!=null){
                //存在:更新数据
                cartItemMapValue.setNum(cartItemMapValue.getNum()+addCart.getNum());
                //更新
                redisService.setCacheMapValue(CartKey,String.valueOf(addCart.getSkuId()),cartItemMapValue);
            }else{
                //不存在:存入
                redisService.setCacheMapValue(CartKey,String.valueOf(addCart.getSkuId()),cartItem);
            }
        }



//        //循环
//        keys.forEach(key -> {
//            //获取到存取的map
//            Map<String, CartItem> cartItemMap = redisService.getCacheMap(key);
//            //循环map
//            cartItemMap.forEach((skuId, MartMapcartItem) -> {
//                //判断是否有该商品详情
//                if (skuId.equals(String.valueOf(addCart.getSkuId()))){
//                    //存在：更新
//
//                }else {
//                    //不存在：添加
//                    redisService.setCacheMapValue(CartKey,String.valueOf(addCart.getSkuId()),cartItem);
//                }
//            });
//        });

    }



    /**
     * 删除购物车
     * @param skuIds
     */
    @Override
    public void delCartItem(String skuIds) {
//        //获得登录用户
//        LoginUser loginUser = SecurityUtils.getLoginUser();

        //测试数据
        LoginUser testUser = new LoginUser();
        testUser.setUserid(Long.valueOf(1));
//        //获取Key
//        String CartKey = CartConstants.USER_CART+String.valueOf(loginUser.getUserid());
        //获取Key
        String CartKey = CartConstants.USER_CART+String.valueOf(testUser.getUserid());
        //分割
        String[] skuIdsSplit = skuIds.split(",");
        //循环
        for (int i = 0; i < skuIdsSplit.length; i++) {
            //删除购物车
            redisService.deleteCacheMapValue(CartKey,String.valueOf(skuIdsSplit[i]));
        }
    }

    /**
     * 清空数据库
     */
    @Override
    public void delAllCartItem() {
        mapper.delAllCartItem();
    }

    /**
     * 同步数据库
     * @param cartItemValue
     */
    @Override
    public void syncCartItem(CartItem cartItemValue) {
        //调用方法
        mapper.syncCartItem(cartItemValue);
    }

    /**
     * 获得购物车信息
     * @return
     */
    @Override
    public List<Cart> getCartVo() {
        //获取登录用户
        LoginUser loginUser = SecurityUtils.getLoginUser();
        //获取key
        String CartKey = CartConstants.USER_CART+String.valueOf(loginUser.getUserid());
        //根据key获取到所有的购物车信息
        Map<String, CartItem> cartMap = redisService.getCacheMap(CartKey);
        //创建返回值对象
        List<Cart> cartVos = new ArrayList<>();
        //创建cartItem集合
        ArrayList<CartItem> cartItems = new ArrayList<>();
        //循环
        cartMap.forEach((key,value) ->{
            //创建对象
            CartItem cartItem = new CartItem();
            //赋值
            BeanUtils.copyProperties(value,cartItem);
            //添加
            cartItems.add(cartItem);
        });
        ArrayList<CartItem> cartItemChild = new ArrayList<>();
        ArrayList<CartItem> cartAnotherItemChild = new ArrayList<>();
        //循环
        for (int i = 0; i < cartItems.size(); i++) {
            for (int j = 1; j < cartItems.size(); j++) {
                if (cartItems.get(i).getSellerId()==cartItems.get(j).getSellerId()){
                    cartItemChild.add(cartItems.get(i));
                }else{
                    cartAnotherItemChild.add(cartItems.get(j));
                }
            }
        }
        //创建Cart对象
        Cart cart = new Cart();
        //循环拿到卖家名称
        cartItemChild.forEach(cartItem -> {
            String sellName = mapper.getSellNameById(cartItem.getSellerId());
            //赋值
            cart.setSellerId(cartItem.getSellerId());
            cart.setSellerName(sellName);
        });
        cart.setCartItems(cartItemChild);
        //添加
        cartVos.add(cart);


        //创建Cart对象
        Cart cartTwo = new Cart();
        //循环拿到卖家名称
        cartAnotherItemChild.forEach(cartItem -> {
            String sellName = mapper.getSellNameById(cartItem.getSellerId());
            //赋值
            cartTwo.setSellerId(cartItem.getSellerId());
            cartTwo.setSellerName(sellName);
        });
        cartTwo.setCartItems(cartItemChild);
        //添加
        cartVos.add(cartTwo);

        return cartVos;

    }


    /**
     * 获得购物车添加商品详情
     *
     * @param addCart
     * @return
     */
    private CartItem getCartItem(CartAddDTO addCart) {
        //根据skuId获得skuInfo
        Long sellerId = mapper.getSellerId(addCart.getSkuId());
        //根据skuId获得skuAttrValue
        String attrValue = mapper.getAttrValueBySkuId(addCart.getSkuId());
        //创建cartItem对象
        CartItem cartItem = new CartItem();
        //赋值
        cartItem.setSkuId(addCart.getSkuId());
        cartItem.setSkuPrice(addCart.getPrice());
        cartItem.setSpuId(addCart.getSpuId());
        cartItem.setSkuImg(addCart.getSkuDefaultImg());
        cartItem.setChecked(addCart.getChecked());
        cartItem.setNum(addCart.getNum());
        cartItem.setSkuTitle(addCart.getSkuTitle());
        cartItem.setSellerId(sellerId);
        cartItem.setSkuAttrValue(attrValue);
        return cartItem;
    }













    /**
     * 操作数据库添加购物车
     * @param addCart
     * @param loginUser
     */
    public void addCartDataSource(CartAddDTO addCart,LoginUser loginUser){
        //判断登录用户购物车中是否有该卖家
        CartPo cartPo = mapper.getCartPoByUserId(loginUser.getUserid());
        List<CartDetailPo> cartDetailPos = mapper.getCartDetailByUserIdSkuId(addCart.getSellerId(),loginUser.getUserid());
        //非空判断
        if (cartPo!=null){
            //从商品详情中获取到该卖家信息
            CartDetailPo cartDetailPo = mapper.getCartDetailPoBySellerIdCartId(addCart.getSellerId(),cartPo.getId());
            //非空判断
            if (cartDetailPo!=null){
                throw new ServiceException("该商品已存在购物车");
            }else{
                //根据skuId获得skuAttrValue
                String attrValue = mapper.getAttrValueBySkuId(addCart.getSkuId());
                mapper.addCartItem(addCart,cartPo.getId(),attrValue);
            }
        }
        //添加购物车
        CartPo cartAddInfo = new CartPo();
        cartAddInfo.setUserId(loginUser.getUserid());
        mapper.addCart(cartAddInfo);
        //根据skuId获得skuAttrValue
        String attrValue = mapper.getAttrValueBySkuId(addCart.getSkuId());
        mapper.addCartItem(addCart,cartAddInfo.getId(),attrValue);
    }




}
